package com.example.d6_homework.homework01;

import java.io.File;
import java.util.*;

public class Test {
    private static final Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        createDir();
        deleteDir();
        listFiles();
        getDirSize();
        getSmallFiles();
    }

    // 1. 键盘录入一个新文件夹路径判断该路径是否存在 如果存在,则什么都不做  如果不存在,则创建该文件夹
    public static void createDir() {
        System.out.print("请输入文件夹路径:");
        String path = sc.nextLine();
        File file = new File(path);
        if (!file.exists()) {
            // 文件夹不存在
            if (file.mkdirs()) {
                System.out.println("文件夹创建成功");
            } else {
                System.out.println("文件夹创建失败");
            }
        } else {
            System.out.println("文件夹已存在");
        }
    }

    // 2. 键盘录入一个路径,并将该路径指向的文件或文件夹删除；[别瞎玩]
    public static void deleteDir() {
        System.out.print("请输入文件夹路径:");
        String path = sc.nextLine();
        File file = new File(path);
        if (file.exists()) {
            // 说明这个文件夹存在
            deleteDirOrFile(file);
        } else {
            // 说明这个文件夹不存在
            System.out.println("指定的路径不存在");
        }
    }

    // 3. 获得指定文件夹下所有的java文件(不考虑子文件夹的)并输出到控制台
    public static void listFiles() {
        System.out.print("请输入文件夹路径:");
        String path = sc.nextLine();
        File file = new File(path);
        if (file.exists() && file.isDirectory()) {
            // 说明这个文件夹存在,获取一级文件对象
            File[] files = file.listFiles();
            for (File file1 : files) {
                String name = file1.getName();
                // 获取文件后缀名
                int dotIndex = name.lastIndexOf(".");
                if (dotIndex > 0 && name.substring(dotIndex).equalsIgnoreCase(".java")) {
                    System.out.println(name);
                }
            }
        } else {
            System.out.println("指定的路径不存在");
        }
    }

    // 4. 统计任意一个文件夹的大小 （length()方法可以获取文件的大小）
    public static void getDirSize() {
        System.out.print("请输入文件夹路径:");
        String path = sc.nextLine();
        File file = new File(path);
        if (file.exists() && file.isDirectory()) {
            // 说明这个文件夹存在
            long size = calculateFolderSize(file);
            System.out.println("文件夹大小为：" + size / 1024.0 + "KB");
        } else {
            System.out.println("指定的路径不存在");
        }
    }

    // 5. 键盘录入一个路径,将指定路径下的小于200K的小文件,并打印
    public static void getSmallFiles() {
        System.out.print("请输入文件夹路径:");
        String path = sc.nextLine();
        File file = new File(path);
        if (file.exists() && file.isDirectory()) {
            // 获取一级文件对象
            File[] files = file.listFiles();
            if (files != null) {
                for (File file1 : files) {
                    if (file1.length() < 200 * 1024 && file1.isFile()) {
                        System.out.printf("文件: %s, 大小: %.2f KB\n", file.getName(), file.length() / 1024.0);
                    } else {
                        System.out.println("没有文件小于200K");
                    }
                }
            } else {
                System.out.println("文件夹为空");
            }
        } else {
            System.out.println("指定的路径不存在");
        }
    }

    /**
     * 递归统计文件夹大小
     *
     * @param dir 文件对象
     * @return 返回文件夹中所有文件的大小
     */
    private static long calculateFolderSize(File dir) {
        long size = 0;

        // 判断dir是否是文件如果是文件直接返回文件大小
        if (dir.isFile()) {
            size = dir.length();
        }

        // 说明dir是一个文件夹对象底下有内容
        File[] files = dir.listFiles();
        if (files == null) {
            System.out.println("没有权限访问这个文件夹");
            return size;
        }

        // 遍历一级文件夹
        for (File file : files) {
            if (file.isFile()) {
                size += file.length();
            } else {
                size += calculateFolderSize(file);
            }
        }

        // 当上面的循环结束后这个文件夹中所有的文件大小都存在了size中直接返回即可
        return size;
    }

    /**
     * 递归删除删除非空文件夹
     *
     * @param dir 文件夹对象
     */
    private static void deleteDirOrFile(File dir) {
        // 判断dir是否为null
        if (dir == null) {
            return;
        }

        // 判断dir是否是文件如果是文件直接删除
        if (dir.isFile()) {
            dir.delete();
            return;
        }

        // 获取当前目录下的所有一级文件对象
        File[] files = dir.listFiles();
        if (files == null) {
            // 说明没有权限获取这个文件夹
            return;
        }

        // 遍历一级文件对象
        for (File file : files) {
            if (file.isFile()) {
                // 说明是文件直接删除
                file.delete();
            } else {
                // 说明不是文件,进入开文件夹删除里面的所有文件
                deleteDirOrFile(file);
            }
        }
        // 当上面的循环执行完之后文件夹中的文件都被删完了最后在删除这个文件夹
        dir.delete();
    }
}

